<?php

session_start();
include('include/config.php');
include('include/fonctions.php');
$messageErrMail = 'Page : gen-bulletin.php<br />';
actualiser_session();

//On test avant toute chose que l'on a bien les id et le trimestre
if ((isset($_GET['trim'])) && ((intval($_GET['trim'])) > 0)) {
    $trimestre = intval($_GET['trim']);
    $trimNomFic = 'periode-' . $trimestre;

    /*     * **********************************
     *      Définition pdf
     * *********************************** */

    require('fpdf17/fpdf.php');

    class PDF extends FPDF {

        // En-tête du pdf qui va se retrouver sur toutes les feuilles à générer
        function Header() {
            //on récupère le nom de l'école et le nom de l'engseignant
            global $nom_Ecole, $titre;
            // Police Arial gras 15
            $this->SetFont('helvetica', 'B', 16);
            $this->Cell(0, 0, utf8_decode($nom_Ecole), 0, 2, 'C');
            $this->Ln(8);
            $this->Cell(0, 0, utf8_decode($titre), 0, 2, 'C');
            $this->Ln(5);
        }

    }

    // Instanciation de la classe dérivée
    $pdf = new PDF();
    // Titres des colonnes
    $pdf->SetFont('helvetica', '', 12);


    $connection = connexionBdd();
    /*     * *******************************************************************
     *    On récupère l'ensemble des paramètres d'un professeur,
     *    comme son nom, civilité et les option de son compte
     * ******************************************************************* */
    $req = $connection->prepare('SELECT `prof_id`,
                                `prof_nom`,
                                `prof_civ`,
                                `nom_ecole`,
                                `prof_virgule`,
                                `prof_abs`,
                                `prof_soin`
                                FROM `prof`
                                NATURAL JOIN `ecole`
                                WHERE `prof_id` =:id
                                LIMIT 0 , 1');
    $req->bindParam(':id', $_SESSION['prof_id'], PDO::PARAM_INT);
    $req->execute();
    $donnees = $req->fetch(PDO::FETCH_ASSOC);
    $req->closeCursor();

    //on va gérer si on écrit observation enseignant ou enseignante en fonction de la civilité
    $e = 'e';
    if ($donnees['prof_civ'] == 'M') {
        $e = '';
    }

    //intitulé du bulletin
    $nom_Ecole = 'Bulletin trimestriel - ' . $donnees['nom_ecole'];
    //titre bulletin Civ+Nom enseignant
    $titre = 'Classe de ' . $donnees['prof_civ'] . ' ' . $donnees['prof_nom'];

    //précision après la virgule
    $precision = $donnees['prof_virgule'];

    //classement apparent sur le bulletin => pas encore opérationel
    $classement = false;

    //afficher l'intitulé nbr absence
    if ($donnees['prof_abs'] == 0)
        $absence = false;
    else
        $absence = true;

    //ajout de la case comportement
    if ($donnees['prof_soin'] == 0)
        $comportement = false;
    else
        $comportement = true;

    /*     * ****************************************************************************
     *      On cherche à connaitre le nombre de niveau
     *      que possède l'enseignant
     * **************************************************************************** */
    $reqNbrNiveau = $connection->prepare('SELECT DISTINCT  `id_niveau`
                                        FROM  `eleve`
                                        WHERE  `id_prof` =:id
                                        ORDER BY `id_niveau`
                                        LIMIT 0 , 10');
    $reqNbrNiveau->bindParam(':id', $_SESSION['prof_id'], PDO::PARAM_INT);
    $reqNbrNiveau->execute();
    $nbrNiveau = $reqNbrNiveau->rowCount();
    $tabNiveau = $reqNbrNiveau->fetchAll(PDO::FETCH_ASSOC);
    $reqNbrNiveau->closeCursor();

//    echo '<pre>';
//    print_r($tabNiveau);
//    echo '</pre>';
    /*     * *********************************************************************************************
     *      on récupère la liste des elèves d'un enseignant
     *      pour la clause IN de la requete suivante
     *      et ceux pour chaque classe
     * ********************************************************************************************* */
    $i = 0;
    foreach ($tabNiveau as $valueNiveau) {
        $req = $connection->prepare('SELECT  `id_eleve` ,  `nom_eleve` ,  `prenom_eleve` ,  `nom_niveau`
                                FROM  `eleve` e
                                NATURAL JOIN  `niveau`
                                WHERE e.`id_prof` =:id
                                AND  `id_niveau` =:idNiveau
                                ORDER BY `nom_eleve` ,  `prenom_eleve`');

        $req->bindParam(':id', $_SESSION['prof_id'], PDO::PARAM_INT);
        $req->bindParam(':idNiveau', $valueNiveau['id_niveau'], PDO::PARAM_INT);
        $req->execute();
        $nbrEleve = $req->rowCount();
        $tabEleve[$i] = $req->fetchAll(PDO::FETCH_ASSOC);
        $req->closeCursor();


        /*         * *******************************************************************
         *      on recupère les id des eleves sous forme de liste
         *      avec une liste par niveau
         * ******************************************************************* */
        foreach ($tabEleve[$i] as $valueId) {
            $liste_eleve[$i][] = $valueId['id_eleve'];
        }

        $i++;
    }
//    echo '<pre>';
//    print_r($liste_eleve);
//    echo '</pre>';
    /*     * **********************************************************************
     *     récupération des moyennes de classes d'un trimestre
     *      Par niveau
     * ********************************************************************* */

    for ($i = 0; $i < $nbrNiveau; $i++) {
        $liste = implode(",", $liste_eleve[$i]);
//        echo '<pre>';
//        print_r($liste);
//        echo '</pre>';
        $query = 'SELECT AVG(`numerique_note`) AS moyenne,`nom_matiere`,`id_matiere`
            FROM `note`
            NATURAL JOIN `matiere`
            WHERE `trimestre_note` = ' . $trimestre . '
            AND `id_eleve` IN (' . $liste . ')
            GROUP BY `id_matiere`
            ORDER BY `id_domaine`,`nom_matiere`';

        $reqMoyClasse = $connection->query($query);
        try {
            $reqMoyClasse->execute();
            $count = $reqMoyClasse->rowCount();
//            echo 'Test : '.$count.'<br />';
            if ($count < 1) {
                echo 'Vous n\'avez aucune moyenne pour cette p&eacute;riode. Merci de renseigner des notes.';
                exit();
            } else {
                $moyenneClasse[$i] = $reqMoyClasse->fetchAll(PDO::FETCH_ASSOC);
            }
            $reqMoyClasse->closeCursor();
        } catch (Exception $e) {
            $messageErrMail .= 'Nous n\'avons pas trouvé de moyenne au compte : ' . $_SESSION['prof_id'] . ' et trimestre : ' . $trimestre;
            error_log($messageErrMail, 1, $mailAdmin, $enteteErrLog);
        }

        /*         * ********************************************************
         *      On va calculer la moyenne générale de la classe
         * ******************************************************** */
        $adition = 0;
        foreach ($moyenneClasse[$i] as $value) {
            if (is_numeric($value['moyenne'])) {
                $adition += round($value['moyenne'], $precision);
            }
        }
        $moyenneGlobalClasse[$i] = round($adition / count($moyenneClasse[$i]), $precision);

        //Pour connaitre la position
        $positionEleve = 1;
        foreach ($tabEleve[$i] as $row) {
            //pour la moyenne de l'èleve
            $adition = $nbrMatiere = 0;

            $pdf->AddPage();
            $pdf->Cell(47, 5, utf8_decode('Nom :'), 0, 0, 'R');
            $pdf->Cell(47, 5, utf8_decode(stripslashes($row['nom_eleve'])), 0, 0);
            $pdf->Cell(47, 5, utf8_decode('Niveau :'), 0, 0, 'R');
            $pdf->Cell(47, 5, utf8_decode($row['nom_niveau']), 0, 0);
            $pdf->Ln();

            $pdf->Cell(47, 5, utf8_decode('Prénom :'), 0, 0, 'R');
            $pdf->Cell(47, 5, utf8_decode(stripslashes($row['prenom_eleve'])), 0, 0);
            $pdf->Cell(47, 5, utf8_decode('Période :'), 0, 0, 'R');
            $pdf->Cell(47, 5, utf8_decode($trimestre), 0, 0);
            $pdf->Ln();

            if ($absence) {
                $pdf->Cell(47, 5, utf8_decode('Nombre d\'absences :'), 0, 0, 'R');
                $pdf->Cell(47, 5, '', 0, 0);
            }

            if ($classement) {
                $pdf->Cell(47, 5, utf8_decode('Classement :'), 0, 0, 'R');
                $pdf->Cell(47, 5, utf8_decode($i++ . '/' . $nbrEleve), 0, 0);
            }
            $pdf->Ln(8);

            $pdf->SetFont('helvetica', 'B', 11);
            $pdf->Cell(20);
            $pdf->Cell(85, 5, utf8_decode('Matière'), 1, 0, 'C');
            $pdf->Cell(33, 5, utf8_decode('Moy. éléve'), 1, 0, 'C');
            $pdf->Cell(33, 5, utf8_decode('Moy. classe'), 1, 0, 'C');
            $pdf->Ln();
            $pdf->SetFont('helvetica', '', 10);

            //gestion de l'alternance de la couleur de fond des lignes
            $fontBool = true;
            $pdf->SetFillColor(240, 240, 240);

            $reqFinal = $connection->prepare('SELECT AVG(`numerique_note`) as `moyenne`
                                FROM `note`
                                WHERE `id_matiere`= :idMatiere
                                AND `id_eleve`= :idEleve
                                AND `trimestre_note`= :trimestre');
            $reqFinal->bindValue(':trimestre', $trimestre, PDO::PARAM_INT);

            //Boucle pour les notes par domaines et par élèves.
            foreach ($moyenneClasse[$i] as $listeMatiere) {
                $reqFinal->bindValue(':idMatiere', $listeMatiere['id_matiere'], PDO::PARAM_INT);
                $reqFinal->bindValue(':idEleve', $row['id_eleve'], PDO::PARAM_INT);
                try {
                    $reqFinal->execute();
                    $moyEleveMatiere = $reqFinal->fetch(PDO::FETCH_ASSOC);
                } catch (Exception $e) {
                    $messageErrMail .= 'Erreur lors de la recherche d\'une moyenne par élève. Compte : ' . $_SESSION['prof_id'] . ' et trimestre : ' . $trimestre;
                    $messageErrMail .= '<pre>' . $GLOBALS . '</pre>';
                    error_log($messageErrMail, 1, $mailAdmin, $enteteErrLog);
                }

                $adition += round($moyEleveMatiere['moyenne'], $precision);
                $pdf->Cell(20);
                $pdf->Cell(85, 9, stripslashes(utf8_decode($listeMatiere['nom_matiere'])), 1, 0, 'L', $fontBool);

                //Gestion du cas où l'élève est absent. Il n'as pas zero, mais la mention ABS
                if ($moyEleveMatiere['moyenne'] != NULL) {
                    $nbrMatiere++;
                    $pdf->Cell(33, 9, round($moyEleveMatiere['moyenne'], $precision), 1, 0, 'C', $fontBool);
                } else {
                    $pdf->Cell(33, 9, 'Abs', 1, 0, 'C', $fontBool);
                }
                $pdf->SetFont('helvetica', '', 11);
                $pdf->Cell(33, 9, round($listeMatiere['moyenne'], $precision), 1, 0, 'C', $fontBool);
                $pdf->Ln();
                $fontBool = !$fontBool;
            }

            $pdf->SetFillColor(0, 0, 0);
            $pdf->SetFont('helvetica', 'B', 12);
            $pdf->Cell(20);
            $pdf->Cell(85, 8, utf8_decode('Moyenne : '), 1, 0, 'R');

            //dans le cas extremère ou un élève ne possède aucune note pour un trimestre on affiche une moyenne ABS
            if ($nbrMatiere == 0)
                $pdf->Cell(33, 8, 'ABS', 1, 0, 'C');
            else
                $pdf->Cell(33, 8, round($adition / $nbrMatiere, $precision), 1, 0, 'C');
            $pdf->Cell(33, 8, $moyenneGlobalClasse[$i], 1, 0, 'C');
            $pdf->Ln(15);

            if ($comportement) {
                $pdf->SetFont('helvetica', 'B', 12);
                $pdf->Cell(196, 7, utf8_decode('Comportement/Soin :'), 1, 0, 'L');
                $pdf->Ln();
            }

            //Observation
            $pdf->SetFont('helvetica', 'B', 12);
            $pdf->Cell(98, 7, utf8_decode('Observations de l\'enseignant') . $e, 1, 0, 'C');
            $pdf->Cell(98, 7, utf8_decode('Observations de la direction'), 1, 0, 'C');
            $pdf->Ln();
            $pdf->Cell(98, 40, '', 1, 0);
            $pdf->Cell(98, 40, '', 1, 0);
            $pdf->Ln(43);
            //Signature
            $pdf->SetFont('helvetica', '', 11);
            $pdf->Cell(0, 5, utf8_decode('Signature des parents'), 0, 0, 'C');
        }
    }
    $pdf->SetAuthor('www.bulletin-facile.fr');
    $pdf->SetCreator('Wicenty Web');

    if (isset($_GET['out']) && ($_GET['out'] == 'D')) {
        $pdf->Output('bulletin/Bulletin-2012_2013-' . $donnees['prof_id'] . '-' . $donnees['prof_nom'] . '-' . $trimNomFic . '.pdf', 'D');
    } else {
        $pdf->Output('bulletin/Bulletin-2012_2013-' . $donnees['prof_id'] . '-' . $donnees['prof_nom'] . '-' . $trimNomFic . '.pdf', 'I');
        $pdf->Output('bulletin/Bulletin-2012_2013-' . $donnees['prof_id'] . '-' . $donnees['prof_nom'] . '-' . $trimNomFic . '.pdf', 'F');
    }
} else {
    exit();
}
?>